package main;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;

import util.Real;
import util.StdinReader;

public class StockPlanner {
	private static void imprimeMensagemDeUso() {
		System.out.println("Modo de usar:");
		System.out
				.println("modulo corretora precoDeCompra quantidadeComprada quantidadeVendida precoInicial precoFinal\n"
						+ "modulo:\n"
						+ "\t1 - simulacao\n"
						+ "\t2 - swap\n"
						+ "\t3 - sequencia\n"
						+ "corretora :\n"
						+ "\t1 - fator\n" + "\t2 - agora");
	}

	public static void main(String[] args) throws InterruptedException,
			ParseException {
		Simulador simulacao;
		String corretora;
		Real precoCompra;
		BigDecimal quantidadeComprada;
		BigDecimal quantidadeVendida;
		Real ini;
		Real fim;
		BigDecimal desconto;
		Modulo modulo;
		if (args.length < 7) {
			imprimeMensagemDeUso();
			System.out.print("modulo : ");
			Modulo.forID(StdinReader.getInt());
			System.out.print("corretora : ");
			corretora = StdinReader.getString();
			System.out.print("precoDeCompra : ");
			precoCompra = new Real(StdinReader.getDouble(), RoundingMode.UP);
			System.out.print("quantidadeComprada  : ");
			quantidadeComprada = new BigDecimal(StdinReader.getInt());
			System.out.print("quantidadeVendida : ");
			quantidadeVendida = new BigDecimal(StdinReader.getInt());
			System.out.print("precoInicial : ");
			double t = StdinReader.getDouble();
			ini = new Real(t, RoundingMode.UP);
			System.out.println(t);
			System.out.println(ini);
			System.out.print("precoFinal : ");
			fim = new Real(StdinReader.getDouble(), RoundingMode.UP);
			System.out.print("desconto(%) : ");
			desconto = new BigDecimal(StdinReader.getDouble());

		} else {
			modulo = Modulo.forID(new Integer(args[0]));
			corretora = args[1];
			precoCompra = new Real(NumberFormat.getInstance().parse(args[2])
					.doubleValue(), RoundingMode.UP);
			quantidadeComprada = new BigDecimal(NumberFormat.getInstance()
					.parse(args[3]).intValue()).setScale(0, RoundingMode.DOWN);
			quantidadeVendida = new BigDecimal(NumberFormat.getInstance()
					.parse(args[4]).intValue()).setScale(0, RoundingMode.DOWN);
			ini = new Real(NumberFormat.getInstance().parse(args[5])
					.doubleValue());
			fim = new Real(NumberFormat.getInstance().parse(args[6])
					.doubleValue());
			desconto = new BigDecimal(NumberFormat.getInstance().parse(args[7])
					.doubleValue()).setScale(2, RoundingMode.DOWN);
		}
		simulacao = new Simulador(corretora, precoCompra, quantidadeComprada,
				quantidadeVendida, ini, fim, desconto);
		simulacao.imprimir();
	}

	private static final class Modulo {
		public static final Modulo SIMULACAO = new Modulo(1);

		public static final Modulo SWAP = new Modulo(2);

		public static final Modulo SEQUENCIA = new Modulo(3);

		private static Map<Integer, Modulo> map = new HashMap<Integer, Modulo>();
		static {
			map.put(1, SIMULACAO);
			map.put(2, SWAP);
			map.put(3, SEQUENCIA);

		}

		private int id;

		private Modulo(int id) {
			this.id = id;
		}

		public static Modulo forID(int id) {
			if (!map.containsKey(id))
				throw new IllegalArgumentException("Modulo com id = " + id
						+ " não existe.");
			return (Modulo) map.get(id);
		}

		public int getID() {
			return id;
		}
	}
}